0%

Python zip函数使用技巧

介绍

zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。 如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同。 利用 号操作符,与zip相反,进行解压。 zip(a,b…): 将多个列表压缩为一个二维列表 zip(a): 将一个二维列表解压为多个列表

使用

语法:
zip(iter1 [,iter2 [...]])

参数:
iter1:一个或多个可迭代对象(字符串、列表、元祖、字典)

返回值:
--> zip object

使用示例:

使用技巧

1、将两个列表合并为字典

a = [chr(ord('a')+i) for i in range(0,10)]
b = list(range(0,26))
print(a)
print(b)
print(dict(zip(a,b)))


['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9}

2、 旋转矩阵

示例1 顺时针旋转:

LeetCode 48. 旋转图像

给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。

说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

给定
matrix = [
  [1,2,3],
  [4,5,6],
  [7,8,9]
],
原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

思路:

先zip(*)解压为,再对每行翻转
[[1,2,3],[4,5,6],[7,8,9]] -> [[1,4,7],[2,5,8],[3,6,9]] -> [[7,4,1],[8,5,2],[9,6,3]]
或者:
[[1,2,3],[4,5,6],[7,8,9]] -> [[7,8,9],[4,5,6],[1,2,3]] -> [[7,4,1],[8,5,2],[9,6,3]]

代码:

def rotate(matrix):
    matrix[:] = list(zip(*matrix[::-1]))

def rotate2(matrix):
    matrix[:] = [x[::-1] for x in list(zip(*matrix))]

A = [
  [1,2,3],
  [4,5,6],
  [7,8,9]
]
rotate(A)
print(A)

[(7, 4, 1), (8, 5, 2), (9, 6, 3)]

示例2 逆时针旋转:

LeetCode 54. 螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:
输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

代码:

def spiralOrder(matrix):
    """
    :param matrix: 二维列表
    :return: 顺时针输出的一维数组
    """
    res = []

    while matrix:
        """
        删除第一行 然后二维数组逆时针旋转90度 继续再删除第一行 一直这样直到没有可以输出的了
        [
          [5, 6, 7, 8],   ===>   [[8,12],[7,11],[6,10],[5,9]]
          [9,10,11,12]
        ]
        """
        res += matrix.pop(0)
        if matrix:
            matrix[:] = zip(*list(map(reversed,matrix)))
    return res


print(spiralOrder([
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]))

[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]